package com.spring.redis.operation.service.impl;

import com.spring.redis.operation.contants.RedisKeyUtils;
import com.spring.redis.operation.service.StringRedisService;
import com.spring.redis.operation.service.base.impl.StringRedisBaseServiceImpl;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * redis 操作string类型缓存
 *
 * @author zhouyu
 */
@Service
public class StringRedisServiceImpl extends StringRedisBaseServiceImpl implements StringRedisService {


    public StringRedisServiceImpl(RedisTemplate<String, Object> redisTemplate, ValueOperations<String, Object> valueOperations, ValueOperations<String, String> stringValueOperations) {
        super(redisTemplate, valueOperations, stringValueOperations);
    }

    /**
     * 设置string类型缓存
     *
     * @param clazz 实体类
     * @param key   key
     * @param value value
     */
    @Override
    public void set(Class<?> clazz, String key, String value) {
        super.set(RedisKeyUtils.getStringKey(clazz, key), value);
    }

    /**
     * 设置string类型缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param value     value
     */
    @Override
    public void set(String className, String key, String value) {
        super.set(RedisKeyUtils.getStringKey(className, key), value);
    }

    /**
     * 设置string类型缓存，并设置过期时间
     *
     * @param clazz   实体类
     * @param key     key
     * @param value   value
     * @param seconds 过期时间，为null不过期
     */
    @Override
    public void setEx(Class<?> clazz, String key, String value, Long seconds) {
        super.setEx(RedisKeyUtils.getStringKey(clazz, key), value, seconds);
    }

    /**
     * 设置string类型缓存，并设置过期时间
     *
     * @param className 自定义缓存
     * @param key       key
     * @param value     value
     * @param seconds   过期时间，为null不过期
     */
    @Override
    public void setEx(String className, String key, String value, Long seconds) {
        super.setEx(RedisKeyUtils.getStringKey(className, key), value, seconds);
    }

    /**
     * 获取string类型缓存
     *
     * @param clazz 实体类
     * @param key   key
     * @return java.lang.String
     */
    @Override
    public String get(Class<?> clazz, String key) {
        return super.get(RedisKeyUtils.getStringKey(clazz, key));
    }

    /**
     * 获取string类型缓存
     *
     * @param className 自定义缓存
     * @param key       key
     * @return java.lang.String
     */
    @Override
    public String get(String className, String key) {
        return super.get(RedisKeyUtils.getStringKey(className, key));
    }

    /**
     * 设置string key过期时间
     *
     * @param clazz   实体类
     * @param key     key
     * @param seconds 过期时间,单位秒
     */
    @Override
    public void expire(Class<?> clazz, String key, Long seconds) {
        super.expire(RedisKeyUtils.getStringKey(clazz, key), seconds);
    }

    /**
     * 设置string key过期时间
     *
     * @param className 自定义缓存
     * @param key       key
     * @param seconds   过期时间,单位秒
     */
    @Override
    public void expire(String className, String key, Long seconds) {
        super.expire(RedisKeyUtils.getStringKey(className, key), seconds);
    }

    /**
     * 设置string key过期时间
     *
     * @param className 自定义缓存
     * @param key       key
     * @param expire    自定义过期时间
     * @param timeUnit  自定义时间类型,为null默认单位为秒
     */
    @Override
    public void expire(String className, String key, Long expire, TimeUnit timeUnit) {
        super.expire(RedisKeyUtils.getStringKey(className, key), expire, timeUnit);
    }

    /**
     * 删除string类型缓存
     *
     * @param clazz 实体类
     * @param key   key
     */
    @Override
    public void del(Class<?> clazz, String key) {
        super.del(RedisKeyUtils.getStringKey(clazz, key));
    }

    /**
     * 删除string类型缓存
     *
     * @param className 自定义缓存
     * @param key       key
     */
    @Override
    public void del(String className, String key) {
        super.del(RedisKeyUtils.getStringKey(className, key));
    }

    /**
     * 删除String 类型指定key的缓存
     *
     * @param key key
     */
    @Override
    public void del(String key) {
        super.del(key);
    }

    /**
     * 递增num，num<0时递减
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param initNum   初始值
     * @param num       自增自减值
     * @return java.lang.Long 自增自减后的值
     */
    @Override
    public Long increment(String className, String key, Long initNum, Long num) {
        return super.increment(RedisKeyUtils.getStringKey(className, key), initNum, num);
    }

    /**
     * 自增值,并设置时效时间
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param initNum   初始值
     * @param num       自增值
     * @param seconds   时效时间，单位秒
     * @return java.lang.Long 自增后的值
     */
    @Override
    public Long incrementExpire(String className, String key, Long initNum, Long num, Long seconds) {
        Long increment = increment(className, key, initNum, num);
        expire(className, key, seconds);
        return increment;
    }

    /**
     * 自增值,并设置时效时间
     *
     * @param clazz   自定义缓存名称
     * @param key     key
     * @param initNum 初始值
     * @param num     自增值
     * @param seconds 时效时间，单位秒
     * @return java.lang.Long 自增后的值
     */
    @Override
    public Long incrementExpire(Class<?> clazz, String key, Long initNum, Long num, Long seconds) {
        Long increment = increment(clazz, key, initNum, num);
        expire(clazz, key, seconds);
        return increment;
    }

    /**
     * 自增自减
     *
     * @param clazz   实体类
     * @param key     key
     * @param initNum 初始值
     * @param num     自增自减值
     * @return java.lang.Long 自增自减后的值
     */
    @Override
    public Long increment(Class<?> clazz, String key, Long initNum, Long num) {
        return super.increment(RedisKeyUtils.getStringKey(clazz, key), initNum, num);
    }

    /**
     * 获取自增值
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @return java.lang.Long 自增值
     */
    @Override
    public Long incrementValue(String className, String key) {
        return super.incrementValue(RedisKeyUtils.getStringKey(className, key));
    }

    /**
     * 获取自增值
     *
     * @param clazz 实体类
     * @param key   key
     * @return java.lang.Long 自增值
     */
    @Override
    public Long incrementValue(Class<?> clazz, String key) {
        return super.incrementValue(RedisKeyUtils.getStringKey(clazz, key));
    }

    /**
     * 自减
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param initNum   初始值
     * @param num       自减值
     * @return java.lang.Long 自减后的值
     */
    @Override
    public Long decrement(String className, String key, Long initNum, Long num) {
        return super.increment(RedisKeyUtils.getStringKey(className, key), initNum, -num);
    }

    /**
     * 自减
     *
     * @param clazz   实体类
     * @param key     key
     * @param initNum 初始值
     * @param num     自减值
     * @return java.lang.Long 自减后的值
     */
    @Override
    public Long decrement(Class<?> clazz, String key, Long initNum, Long num) {
        return super.increment(RedisKeyUtils.getStringKey(clazz, key), initNum, -num);
    }

    /**
     * 判断key是否存在
     *
     * @param className 类名
     * @param key       key
     * @return java.lang.Boolean
     */
    @Override
    public Boolean hasKey(String className, String key) {
        return super.hasKey(RedisKeyUtils.getStringKey(className, key));
    }

    /**
     * 判断key是否存在
     *
     * @param clazz 类名
     * @param key   key
     * @return java.lang.Boolean
     */
    @Override
    public Boolean hasKey(Class<?> clazz, String key) {
        return super.hasKey(RedisKeyUtils.getStringKey(clazz, key));
    }
}
